home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / b / b.lha / B / src / bed / node.h < prev    next >
Encoding:
C/C++ Source or Header  |  1988-11-24  |  3.4 KB  |  154 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
  2. /* $Header: node.h,v 2.4 85/08/22 16:05:40 timo Exp $ */
  3.  
  4. /*
  5.  * B editor -- Parse tree and Focus stack.
  6.  */
  7.  
  8. /*
  9.  * Assertion macro.
  10.  *
  11.  * This one differs from the one in #include <assert.h> in that it
  12.  * is usable as an expression operand, e.g. up(ep) || Assert(No).
  13.  * The function asserr() must unconditionally terminate the program.
  14.  * If the accumulated __FILE__ data wastes too much of your data
  15.  * space, omit them and change the code in asserr() that uses them.
  16.  * You better trust your code then, because unless compiled with "-g"
  17.  * it's difficult to dig the line number information from the core dump.
  18.  *
  19.  * There is also a variant called Abort() which is equivalent to Assert(No).
  20.  */
  21.  
  22. #ifdef NDEBUG
  23. #define Abort() abort() /* Always fail */
  24. #define Assert(cond) 0 /* Dummy expression */
  25. #else NDEBUG
  26. #undef __FILE__
  27. #define __FILE__ rcsid
  28. #ifndef __LINE__
  29. #define __LINE__ 0
  30. #endif __LINE__
  31. #define Abort() asserr(__FILE__, __LINE__)
  32. #define Assert(cond) ((cond) || Abort())
  33. #endif NDEBUG
  34.  
  35. typedef struct node *node;
  36. typedef struct path *path;
  37. typedef int markbits;
  38.  
  39. struct node {
  40.     char    type;
  41.     char    _unused;
  42.     intlet    refcnt;
  43.     intlet    len;
  44.     markbits    n_marks;
  45.     intlet    n_width;
  46.     intlet    n_symbol;
  47.     node    n_child[1];
  48. };
  49.  
  50. struct path {
  51.     char    type;
  52.     char    _unused;
  53.     intlet    refcnt;
  54.     intlet    len;
  55.     path    p_parent;
  56.     node    p_tree;
  57.     intlet    p_ichild;
  58.     intlet    p_ycoord;
  59.     intlet    p_xcoord;
  60.     intlet    p_level;
  61.     markbits    p_addmarks;
  62.     markbits    p_delmarks;
  63. };
  64.  
  65.  
  66. #define Nnil ((node) NULL)
  67.  
  68. node newnode();
  69.  
  70. #ifndef NDEBUG
  71. #define symbol(n) (Assert(Type(n)==Nod), (n)->n_symbol)
  72. #define nchildren(n) (Assert(Type(n)==Nod), Length(n))
  73. #define marks(n) (Assert(Type(n)==Nod), (n)->n_marks)
  74. #define child(n, i) \
  75.     (Assert(Type(n)==Nod && (i)>0 && (i)<=Length(n)), (n)->n_child[(i)-1])
  76. #define lastchild(n) \
  77.     (Assert(Type(n)==Nod && Length(n)>0), (n)->n_child[Length(n)-1])
  78. #define firstchild(n) \
  79.     (Assert(Type(n)==Nod && Length(n)>0), (n)->n_child[0])
  80. #else NDEBUG
  81. #define symbol(n) ((n)->n_symbol)
  82. #define nchildren(n) (Length(n))
  83. #define marks(n) ((n)->n_marks)
  84. #define child(n, i) ((n)->n_child[(i)-1])
  85. #define lastchild(n) ((n)->n_child[Length(n)-1])
  86. #define firstchild(n) ((n)->n_child[0])
  87. #endif NDEBUG
  88.  
  89. #define width(n) (Type(n)==Tex ? Length((value)(n)) : (n)->n_width)
  90. #define marked(p, x) (marks(tree(p))&(x))
  91.  
  92. #define Pnil ((path) NULL)
  93.  
  94. path newpath();
  95.  
  96. #define parent(p) ((p)->p_parent)
  97. #define tree(p) ((p)->p_tree)
  98. #define ichild(p) ((p)->p_ichild)
  99.  
  100. #define Ycoord(p) ((p)->p_ycoord)
  101. #define Xcoord(p) ((p)->p_xcoord)
  102. #define Level(p) ((p)->p_level)
  103.  
  104. /* Procedure markpath(); */
  105. /* Procedure unmkpath(); */
  106. /* Procedure replace(); */
  107. bool up();
  108. bool downi();
  109.  
  110. #define down(n) downi(n, 1)
  111.  
  112. bool downrite();
  113. bool left();
  114. bool rite();
  115. /* Procedure top(); */
  116. bool nextnode();
  117. /* Procedure firstleaf(); */
  118. bool nextleaf();
  119. bool prevnode();
  120. /* Procedure lastleaf(); */
  121. bool prevleaf();
  122. bool nextmarked();
  123. bool prevmarked();
  124.  
  125. /*
  126.  * The following are routines for lint, but macros for CC.
  127.  * This way lint can detect wrong arguments passed.
  128.  */
  129.  
  130. #ifdef lint
  131.  
  132. node nodecopy();
  133. noderelease();
  134. nodeuniql();
  135.  
  136. path pathcopy();
  137. pathrelease();
  138. pathuniql();
  139.  
  140. #else
  141.  
  142. #define nodecopy(n) ((node)copy(n))
  143. #define noderelease(n) release(n)
  144. #define nodeuniql(pn) uniql(pn)
  145.  
  146. #define pathcopy(p) ((path)copy(p))
  147. #define pathrelease(p) release(p)
  148. #define pathuniql(pp) uniql(pp)
  149.  
  150. #endif
  151.  
  152. node grab_node();
  153. path grab_path();
  154.